[Język C] Operacje na tablicy znakowej

Witam,

W ramach ćwiczeń wymyśliłem sobie pewien mini projekt. Chcę napisać program który pobiera 20 słów, po czym na końcu wyświetla statystykę ile razy dane słowo zostało wpisane.

np: Program pobiera pięć słów: ala ala ma ala kota

Wydruk: ala 3 ma 1 kota 1

I problem jest następujący. Posiadając zapisane pobrane wyrazy w tablicy char, nie mogę wymyślić jak zliczyć ilość powtórzeń występowania danego wyrazu. Nie wiem czy to ta późna pora mi przyćmiła umysł czy może problem nie jest taki łatwy jak się wydaje.

Z góry dziękuję za pomoc.

  • 20 słów to malutko, nawet nie ma potrzeby sortowania.

    Na taki problem wystarczą dwie tablice.

    char* slowa[20];
    int count[20];
    

    Rozumiem, że zczytujesz ze stdin. Jeżeli słowo występuje w tablicy (szukaj liniowo), to odpowiedni indeks zwiększ o 1, jeżeli nie występuje, dodaj na koniec (możesz sobie ustawić jakiś licznik, albo szukać '\0' w tablicy) i też zwiększ o 1.

    Wydaje mi się, że w takim problemie jakieś korzystanie z wydumanych struktur jest nadużyciem.

    Zamiast wymyślać samemu takie zadania (to jest trywialne), polecam ci zająć się jakimiś zadaniami "z prawdziwego zdarzenia", typu OPSS albo SPOJ.

  • W "czystym" C wymyślając koło od nowa możesz uzyć drzewa zawierające słowo i liczbe wystąpień.

    struct tree_node_t  { 
    char *wrd; 
    int num; 
    struct tree_node_t * lnode; 
    struct tree_node_t * rnode; 
    }
    

    Podczas wczytywania słów dodawaj elementy do drzewa albo podbijaj licznik wystąpienia. Alternatywnie możesz użyć tablicy haszującej. Takie rozwiązanie będzie najwydajniejsze.

    Kolejną opcją jest, jeżeli masz już wczytany cały ciąg do tablicy, to możesz przeszukac go w poszukiwaniu okresów (peroids).

  • Stwórz cokolwiek do trzymania słów, jakiś kontener - i dla każdego słowa sprawdzaj czy już takie występuje, jeżeli tak to inkrementuj wartość, jeżeli nie to stwórz i przypisz 1.

  • Wersja dla C++ :

    Użyj kontenera:

    std::map<std::string, int> mapa;

    Po odczytaniu całego słowa wykonaj:

    mapa[odczytane_slowo]++;

    Całą mapę przejrzysz za pomocą iteratora;

    W C stwórz własny kontener asocjacyjny, albo nawet zwykłą listę (jeżeli nie zależy Ci na szybkości działania).

  • Oprzyj się na odpowiedzi piotreksa ale zastosuj uthash. Zadziała na pewno i dość proste w implementacji.

Zaloguj się, aby dodać swoją odpowiedź